/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    2010 year
 *    Author: Michael Khromov aka MikeDM (Mike D'Morto)
 *    E-Mail: mikedmorto@gmail.com
 */

#include "tspl_login_std.h"
#include "def.h"
#include <QMessageBox>
#include <QTranslator>

bool Tspl_login_std::qinit(const QStringList &cfgstr,const QString & lang){
    // устанавливаем локализацию
    emit this->sigPutLog(PLUGIN_NAME,2,QString("start translate %1").arg(lang));
    QTranslator * trans = new QTranslator();
    if(trans->load(QString(":/%1/lang/%2.qm").arg(PLUGIN_NAME).arg(lang))){
        emit this->sigPutLog(PLUGIN_NAME,2,QString("success translate %1").arg(lang));
        QCoreApplication::installTranslator(trans);
    }else{
        emit this->sigPutLog(PLUGIN_NAME,2,QString("fail translate %1").arg(lang));
    }

    emit this->sigPutLog(PLUGIN_NAME,2,"Info: init");
    // принимаем конфигурационную строку.
    // здесь по идее нужно будет обработать автологин и прочее но это позже. fixit
    emit this->sigPutLog(PLUGIN_NAME,3,"Debug: start parse parameters");
    // дефолтные параметры инициализируем
    this->autologon=false;
    this->info="";
    for(int i = 1; i < cfgstr.size(); i++){
        emit this->sigPutLog(PLUGIN_NAME,3,"Debug: parameter "+QString::number(i)+"="+cfgstr.at(i));
        // вынимаем, сравниваем со своим списком, ежели находим то применяем
        QStringList tt=QString(cfgstr.at(i)).split("=");
        if(tt.size()==2){
            if(tt.at(0)=="autologon"){
                // опапа автологон. парсим значение.
                if(tt.at(1) == "true" or tt.at(1) == "1" or tt.at(1) == "yes" or tt.at(1) == "on"){
                    // все гуд, автологон подтвердилси
                    this->autologon=true;
                    emit this->sigPutLog(PLUGIN_NAME,3,"Debug: enable autologon");

                }else{
                    // ничего хорошего в значении нет, оставляем дефолт
                }
            }else{
                if(tt.at(0) == "info"){
                    // тыкс, есть инфа для логина. она отображается в диалоге запроса.
                    this->info=tt.at(1);
                    emit this->sigPutLog(PLUGIN_NAME,3,"Debug: change info text for login dialog");
                }else{
                    if(tt.at(0) == "user"){
                        this->user=tt.at(1);
                        emit this->sigPutLog(PLUGIN_NAME,3,"Debug: user");
                    }else{
                        if(tt.at(0) == "pass"){
                            this->pass=tt.at(1);
                            emit this->sigPutLog(PLUGIN_NAME,3,"Debug: pass");
                        }
                    }
                }
            }
        }else{
            // ошибочный параметр. пропускаем.
        }
    }

    // подготавливаем диалог
    dia = new MainDialog();
    connect(dia,SIGNAL(sigQexec(QList<QVariant>)),SLOT(slotDiaQuery(QList<QVariant>)));
    // инициализация прошла успешно. плагин готов к работе.
    return true;
}
bool Tspl_login_std::qstart(){
    // проверяем наличие автологина
    if(this->autologon){
         // пропускаем показ диалога, вызываем автологон.
        QList<QVariant> par;
        par.append(this->user);
        par.append(this->pass);
        emit this->sigQexec(PLUGIN_NAME,"logon",par);
        // долбаный цикл ожидания

        this->isalRet=false;
        this->isaFinish=false;
        for(;;){
            //sleep(1);
            QApplication::processEvents();
            if(this->isaFinish){
                return this->isalRet;
            }

        }
    }else{
        this->dia->setInfo(this->info);

        return this->dia->exec();
    }
}
void Tspl_login_std::slotDiaQuery(const QList<QVariant> &parameters){
    // поймали сигнал запроса для базы данных от логин диалога. передаем дальше по цепочке
    emit this->sigQexec(PLUGIN_NAME,"logon",parameters);


}

void Tspl_login_std::slotDb(const QString & plName , int id, QSqlQuery * ret){
    // принимаем данные от плагина баз данных.
    // обязательно проверяем, нам ли пришли данные, иначе будет конфликт и сегфолт.

    if(plName==PLUGIN_NAME){
        this->id=id;
        if(this->autologon){
            while (ret->next()){
                this->isalRet=ret->value(0).toBool();
                emit this->sigClear(this->id);
                this->isaFinish=true;
            }
        }else{

            while (ret->next()){

                ret->first();

                dia->slotLogon(ret->value(0).toBool());
                emit this->sigClear(this->id);
            }

        }

    }

}

void Tspl_login_std::slotDbErr(const QString &plName,  const QString &errtext){
    // проверка принятия сигнала об ошибке запроса

    // сюда свалиться может сейчас только одна ошибка, ошибка запроса, а значит смысла выполнять дальне программу нет.
    // ругаемся в в лог, и выводим страшное окно ошибки.
    if(plName==PLUGIN_NAME){
        //emit this->sigPutLog(PLUGIN_NAME,-1,"Critical Error: database plugin return: "+errtext);
        //QMessageBox::critical(NULL,APP_NAME,"Critical Error: database plugin return: "+errtext);
        //exit(1);
        // сообщаем диалогу об ошибке
        if(this->autologon){
            this->isaFinish=true;
        }else{
            dia->errorDb(errtext);
        }

    }
}


QString Tspl_login_std::getUsername(){
    if(this->autologon){
        return this->user;
    }else{
        return this->dia->getUsername();
    }

}


// синхронный режим. в стандартном исполнении он не нужен. но может пригодиться.
// так что здесь просто заглушко
void Tspl_login_std::slotRstartS(const QString pl_name){}
// ответ положительный с данными по запросу.
void Tspl_login_std::slotFinishS(const QString & plName , QSqlQuery * ret){}
// ответ отрицательный с данными по ошибке
void Tspl_login_std::slotFinishErrS(const QString & plName , const QString & errtext){}



Q_EXPORT_PLUGIN2(TsIfaceLoginPlugin,Tspl_login_std)
